#include <signal.h>
#include <unistd.h>

#include <cstdio>

// 进程也可以向其他的进程发送信号
// int kill(pid_t pid, int sig);
// pid指定了信号发送的对象进程，可以是某个进程的pid，也可以是以下值
// 1. 为0，发送到当前进程所在的进程组的所有进程
// 2. 为-1，按pid由高到低发给所有的进程
// 3. <-1, 发送给pid绝对值的进程组里所有进程
// 说明：仅root可以发给其它用户的进程
//

int ntimes = 0;
void p_action(int sig);
void c_action(int sig);

int main(void) {
    int pid, ppid;
    // 设定父进程SIGUSR1
    signal(SIGUSR1, p_action);
    switch (pid = fork()) {
        case -1:  // fork 失败
            perror("fork error");
            break;

        case 0:  // 子进程
            // 设定子进程的SIGUSR1
            signal(SIGUSR1, c_action);

            ppid = getppid();
            for (;;) {
                kill(ppid, SIGUSR1);
                pause();
            }
            break;
        default:  // 父进程
            for (;;) {
                pause();
                kill(pid, SIGUSR1);
            }
    }
}

void p_action(int sig) {
    printf("[parent]:");
    char buff[1024] = {0};
    fgets(buff, sizeof(buff), stdin);
    // send msg to another process...
}

void c_action(int sig) {
    printf("[child]:");
    char buff[1024] = {0};
    fgets(buff, sizeof(buff), stdin);
    // send msg to another process...
}
